<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

<!--
具名插槽:
    在一个组件中包含多个插槽出口，这个时候可以指定对应的插槽名称

    slot 标签可以指定一个 name 属性，eg: <slot name="header"></slot>

    在自定义标签中，使用 template 标签
-->

<div id="app">
    <!-- 这里没有指定对应的插槽名称，所有内容会填充到 main 标签中的 slot 中  -->
    <lk-box>
        <h1>头部内容</h1>
        <p>这里是主要内容</p>
        <p>尾部内容</p>
    </lk-box>

    <lk-box>

        <!--    使用具名插槽的时候，需要使用 template 标签和 v-slot 指令来指定  -->
        <template v-slot:header>
            <!-- header 插槽的内容放这里 -->
            <h2>头部内容</h2>
        </template>

        <!-- 隐式的默认插槽， 这里可以指定对应的插槽名称，或者不指定以及使用 default -->
        <p>这里是主要内容</p>
        <p>可以不用指定插槽的 name 属性</p>

<!--        <template v-slot:default>-->
<!--            <p>这里是主要内容</p>-->
<!--            <p>可以不用指定插槽的 name 属性</p>-->
<!--        </template>-->

        <template v-slot:footer>
            <!-- header 插槽的内容放这里 -->
            <h2>尾部内容</h2>
        </template>
    </lk-box>
</div>

<template id="box">
    <div style="width: 500px; height: 300px; background-color: #846f74; border-radius: 4px; margin-top: 20px">
        <header>
            <!-- 标题内容放这里 -->
            <slot name="header">默认头部内容</slot>
        </header>
        <main>
            <!-- 主要内容放这里 -->
            <slot>默认主要内容</slot>
        </main>
        <footer>
            <!-- 底部内容放这里 -->
            <slot name="footer">默认底部内容</slot>
        </footer>
    </div>
</template>

</body>
<script src="js/vue.js"></script>
<script>

    const lkBox = {
        data() {
            return {
                boxMsg: "来自 Box 中的消息"
            };
        },
        template: `#box`,   // 这里必须要使用 `` 符号作为字符串
        methods: {
            btnCallback() {
                console.log("box 中 button 调用");
            }
        }
    };

    const app = Vue.createApp({
        data() {
            return {
                "msg": "aaa"
            }
        },
        components: {
            "lk-box": lkBox
        }
    }).mount("#app");
</script>
</html>
